package com.fuhao.singleton.doublelock;

/**
 * 单例模式之双重锁模式
 * @author zhang
 *
 */
public class DoubleLock {

	/**
	 *双重锁模式是在懒汉模式的基础上改写的
	 *把同步方法改为同步代码块，稍微提高了效率
	 *当对象以及实例化了后，不会每次获取对象只有一个线程去获取
	 * 当实例化对象才运用同步锁机制，限制只有一个线程创建对象
	 * 
	 * 缺点：
	 * JVM底层做重排序，仍然会导致创建多次对象
	 * 需要加volatile后，增加可见性。但又出现一个问题，无法保证原子性问题。
	 * 不推荐使用双重锁机制
	 */
	
	//1.创建实例变量
	private static volatile DoubleLock doubleLock;
	//2.私有化对象构造器
	private DoubleLock() {}
	//3.实例化对象
	public static DoubleLock getInstance() {
		if(doubleLock == null) {
			synchronized (DoubleLock.class) {
				if(doubleLock == null) {
					System.out.println("第一次实例化对象");
					doubleLock = new DoubleLock();
					return doubleLock;
				}
			}
		}
		System.out.println("直接获取例化对象");
		return doubleLock;
	}
	
//#############################测试方法#####################################
	public static void main(String[] args) {
		DoubleLock instance1 = DoubleLock.getInstance();
		DoubleLock instance2 = DoubleLock.getInstance();
		System.out.println(instance1==instance2);
	}
}
